package com.demo.java.OD551_600.OD590;

import java.util.Scanner;
import java.util.*;

/**
 * @author bug菌
 * @Source 公众号：猿圈奇妙屋
 * @des： 【流水线调度(B卷-100分)】问题
 * @url： https://blog.csdn.net/weixin_43970743/article/details/146571788
 */
public class OdMain {
    public static void main(String[] args) {
        // 处理输入
        Scanner in = new Scanner(System.in);

        // 读取第一个输入行，获取工作站数 m 和任务数 n
        String input_str = in.nextLine();
        String[] tmp2 = input_str.split(" ");
        int m = Integer.parseInt(tmp2[0]);  // 工作站数量
        int n = Integer.parseInt(tmp2[1]);  // 任务数量

        // 读取第二行任务的处理时间
        String input_str1 = in.nextLine();
        String[] tmp21 = input_str1.split(" ");
        Integer[] times = new Integer[tmp21.length];  // 存储任务时间的数组
        for (int i = 0; i < tmp21.length; i++) {
            times[i] = Integer.parseInt(tmp21[i]);
        }

        // 对任务的时间进行升序排序
        Arrays.sort(times, new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o1 - o2;  // 按升序排序
            }
        });

        // 创建一个数组来记录每个工作站的负载（即每个工作站的任务总时间）
        int[] temp = new int[m];

        // 按顺序分配任务，每次给一个工作站分配一个任务
        for (int i = 0; i < n; i++) {
            // 使用取余运算进行轮流分配
            temp[i % m] += times[i];  // 将任务时间加到对应工作站
        }

        // 输出负载最大的工作站的任务总时间
        System.out.println(Arrays.stream(temp).max().getAsInt());  // 找到负载最大值
    }
}